Android button点击事件/附加题

前言

  • 每一门语音开发的时候都会有点击的业务
  • 点击按钮弹出什么,点击按钮输出什么
  • 今天的课程就学了按钮点击绑定
  • 记录起来

实现button点击事件的方法

  • Button类主要的事件为android:onclick。但也可以通使用了OnclickListener监听器来监听事件,并在onClick()方法中响应。
  • 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法:
      1、匿名内部类
      2、外部类(独立类)
      3、实现OnClickListener接口
      4、添加XML属性

具体实现

  1. 匿名内部类:
      在Android开发中我们会经常看到各种匿名内部类的使用,那么在实现button点击事件的时候也可以用匿名内部类。
      这样使用的好处是:1)不需要重新写一个类,直接在new的时候去实现想实现的方法,很方便。
               2)当别的地方都用不到这个方法的时候使用匿名内部类
               3)高内聚,高内聚是设计原则之一,匿名内部类的特性之一就是拥有高内聚。
      但是也有不足的地方:1)当别的地方也需要同样的一个方法时还要重新再在那个地方写一次匿名内部类,这样使得代码的冗余性很高。
                2)不方便后期的维护
  2. 独立类(外部类):
      重新写一个独立的类来实现业务逻辑或是想要的效
      这样写的好处是:1)一定情况下可以方便维护
              2)可以降低代码的冗余性,可以同时使用到多个地方
      不足的地方是:1)当只使用一次时浪费资源,程序的性能不高
             2)当有很多个方法时代码的可读性不高,此时不方便维护

  3. 实现OnClickListener接口:
      与独立类实现的原理是一样的,优点和缺陷也是大径相同的,实现OnClickListener接口的时候实现它其中的onClick方法

  4. 添加XML属性:
      我们可以给XML添加一个onClick属性来实现点击事件的监控
      这样的好处是:更加便捷,代码量能够减少
      但是不足的地方是:每一次维护的时候都要去XML里面改源码,很不好维护很麻烦

总结:

  1. 在实现监听的时候都是需要两步走:
        1)绑定button按钮 setOnClickListener
        2)监听button事件 onclick()
  2. 具体使用什么方法去实现button按钮点击事件的监听要看具体的需求,都各有各的好处和不足。
    如果只使用一次则推荐使用内部类的方法;
    如果多次使用则使用外部类的方法;
    实现接口的方法可以在原本的类中实现;
    但是在XML里面添加属性的方法时不推荐的,毕竟很不好去维护。

  3. 内部类的使用在Android开发中是经常用到的,所以非常的重要,

  4. Android开发中有很多按钮,但是监听的方法常用的都是这几种

开始写代码

  • 前面看完长长的笔记现在来敲代码了

XML属性(监听button事件 onclick())

  • 要求:点击按钮控制台输出文字
  • 页面:线性布局
  • 一个按钮,一个文本框
  • 其实很简单就只是两步,定义了然后实例化点击函数就可以了
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Buttom_Demo"
    android:orientation="vertical">

    // 1. 绑定id,指定点击函数名
    <Button
    android:id="@+id/button01"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="sss"
    android:text="切换"/>
    <TextView
    android:id="@+id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="adggegege"/>

    </LinearLayout>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.example.yhf.button_demo;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class Buttom_Demo extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.buttom__demo);

}

// 2. 实例化点击函数
public void sss(View view) {
System.out.println("--------------------该按钮是对的控制------------");
}
}

OnClickListener接口方法

  • 我们这次就不输出控制台了,我改变文本内容
  • 这个就比较复杂一点
  • 纯属定义一个按钮和文本就可以,定义id
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 1. 绑定id,指定点击函数名
    <Button
    android:id="@+id/button01"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="切换"/>
    <TextView
    android:id="@+id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="adggegege"/>

  • 接下来就是重点了认真看
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package com.example.yhf.button_demo;

    // 引包输入组件的时候软件自动导入如果没有自己手打
    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    //4 抽象方法 OnClickListener
    public class Buttom_Demo extends AppCompatActivity implements View.OnClickListener {

    // 2. 声明变量
    Button bt1;
    TextView t1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.buttom__demo);

    // 3. 这里是给变量绑定组件
    // 通过id来绑定
    bt1 = (Button)findViewById(R.id.button01);
    t1 = (TextView)findViewById(R.id.text1);

    // 6. 设定点击绑定到bt1也就是按钮
    // 使用setOnClickListener绑定
    bt1.setOnClickListener(this);
    }

    // 5. 实例化抽象方法
    public void onClick(View view) {
    t1.setText("嘿,你好");
    t1.setTextColor(Color.BLUE);
    }
    }

拓展题

  • 按照上面的改成,可以多次点击切换不同的值,不是点了后写死了
  • 分析一下如何做:我的第一想法是给他一个数组写好很多个文字,每一次切换就获取数组中不同的值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    package com.example.yhf.button_demo;

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class Buttom_Demo extends AppCompatActivity implements View.OnClickListener {

    Button bt1;
    TextView t1;

    // 1. 定义一个i用了判断是数据的第几个
    int i = 0;
    // 2. 数据数组
    String[] str = {"a","b","c","d","e"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.buttom__demo);

    bt1 = (Button)findViewById(R.id.button01);
    t1 = (TextView)findViewById(R.id.text1);

    bt1.setOnClickListener(this);
    }

    public void onClick(View view) {
    // 3. 判断大于后又回到0继续从0输出,不然超出会报错的
    if (i>str.length-1) {i=0;}
    // 4. 输出的时候拿数组的值
    t1.setText(str[i]);
    t1.setTextColor(Color.BLUE);
    // 每点击一次一个数
    i++;
    }
    }

补充其余用法

  • 还有两种用法就是绑定外部类和内部类
  • 和拓展题同样的业务,不同的实现方法
  • 要注意引包
  • 其实也是挺简单的用法都差不多只是地方不同
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    package com.example.yhf.button_demo;

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class Buttom_Demo extends AppCompatActivity {

    // Button bt1,bt2;

    Button bt1;
    TextView t1;
    int i = 0;
    String[] str = {"a","b","c","d","e"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.buttom__demo);

    bt1 = (Button)findViewById(R.id.button01);
    t1 = (TextView)findViewById(R.id.text1);

    // 2。 外部类onclik,new 外面的类
    bt1.setOnClickListener(new listener());

    // 3. 内部类onclick
    bt1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    System.out.println("test");
    }
    });
    }

    // 外部类
    class listener implements View.OnClickListener {
    public void onClick(View view) {
    if (i>str.length-1) {i=0;}
    t1.setText(str[i]);
    t1.setTextColor(Color.BLUE);
    i++;
    }
    }
    }

    ### 外部类小案例
    - 多按钮绑定同一点击事件,控制id改变文本
    - 定义了三个按钮,一个文本框
    ``` Java
    package com.example.yhf.button_demo;

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class Buttom_Demo extends AppCompatActivity {

    Button bt1,bt2,bt3;
    TextView t1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.demo);

    bt1 = (Button)findViewById(R.id.bt1);
    bt2 = (Button)findViewById(R.id.bt2);
    bt3 = (Button)findViewById(R.id.bt3);
    t1 = (TextView)findViewById(R.id.text1);

    // 2。 外部类onclik
    bt1.setOnClickListener(new listener());
    bt2.setOnClickListener(new listener());
    bt3.setOnClickListener(new listener());
    }
    // 外部类
    class listener implements View.OnClickListener {
    public void onClick(View v) {
    // 通过判断 引子是getId,点击后会返回一个view的参数
    switch (v.getId()) {
    case R.id.bt1: t1.setText("你爸1"); t1.setTextColor(Color.BLUE); break;
    case R.id.bt2: t1.setText("你爸2"); t1.setTextColor(Color.RED); break;
    case R.id.bt3: t1.setText("你爸3"); t1.setTextColor(Color.YELLOW); break;
    }
    }
    }
    }

后记

  • 今日上课的练习和笔记都记录在这里了,欢迎更多的同行大哥指导交流
  • 欢迎进入我的博客https://yhf7.github.io/
  • 如果有什么侵权的话,请及时添加小编微信以及qq也可以来告诉小编(905477376微信qq通用),谢谢!
-------------本文结束感谢您的阅读-------------
0%